var UN_CODE='aaa';

//长度验证
var lengthValidator = function(val, min, max){
    return val.replace(/[\u0391-\uFFE5]/img, UN_CODE).length >= min && val.replace(/[\u0391-\uFFE5]/img, UN_CODE).length <= max;
};

/**
 * validatebox
 * 
 * @param {Object}
 *            value
 * @param {Object}
 *            param
 */
$.extend(
		$.fn.validatebox.defaults.rules,
				{
					test : {// 测试
						validator : function(val, param) {
							return /^[A-Za-z0-9\u0391-\uFFE5_\-]{0,}$/
									.test(val) ? lengthValidator(val, param[0],
									param[1]) : false;
						},
						message : '{0}-{1}位字符（字母、数字、符号），区分大小写'
					},
					length : {
						validator : function(val, param) {
							if (/^[ 　]/.test(val) || /[ 　]$/.test(val)) {
								return false;
							}
							var len = val.replace(/[\u0391-\uFFE5]/img,
									UN_CODE).length;
							return len >= param[0] && len <= param[1];
						},
						message : "{0}-{1}位字符(中文、英文、数字、特殊字符)，区分大小写(注：1.一个中文字符等于三个英文字符 2.不允许以空格开始和结束)"
					},
					lenghtWithSpace : {
						validator : function(val, param) {
							var len = val.replace(/[\u0391-\uFFE5]/img,
									UN_CODE).length;
							return len >= param[0] && len <= param[1];
						},
						message : "{0}-{1}位字符(中文、英文、数字、特殊字符)，区分大小写(注：1.一个中文字符等于三个英文字符)"
					},
					email : {
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i
									.test(val) ? lengthValidator(val, param[0],
									param[1]) : false;
						},
						message : "{0}-{1}位有效EMAIL地址，区分大小写"
					},
					lengthEmail : {// 邮件长度验证
						validator : function(_21, _22) {
							if (0 == _22[0] && val.length == 0) {
								return true;
							}
							var len = _21.replace(/[\u0391-\uFFE5]/img,
									UN_CODE).length;
							return len >= _22[0] && len <= _22[1];
						},
						message : "{0}-{1}位字符(中文、英文、数字、特殊字符)，区分大小写(注：1.一个中文字符等于三个英文字符 2.不允许以空格开始和结束)"
					},
					url : {
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i
									.test(val) ? lengthValidator(val, param[0],
									param[1]) : false;
						},
						message : "{0}-{1}位有效URL地址，区分大小写"
					},
					minLength : {// 最小长度
						validator : function(value, param) {
							return value.replace(/[\u0391-\uFFE5]/img,
									UN_CODE).length >= param[0];
						},
						message : '最小{0}位字符（中文、英文、数字、下线划、特殊字符），区分大小写'
					},
					maxLength : {// 最大长度
						validator : function(value, param) {
							return value.replace(/[\u0391-\uFFE5]/img,
									UN_CODE).length <= param[0];
						},
						message : '最大{0}位字符（中文、英文、数字、下线划、特殊字符），区分大小写'
					},

					// 单验证english[1.10]
					english : {// 只能输入英文
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /^[A-Za-z]{0,}$/.test(val) ? lengthValidator(
									val, param[0], param[1])
									: false;
						},
						message : '{0}-{1}位英文字符，区分大小写'
					},
					chinese : {// 只能输入中文
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /^[\u0391-\uFFE5]{0,}$/.test(val) ? lengthValidator(
									val, param[0] * 3, param[1] * 3)
									: false;
						},
						message : '{0}-{1}位中文字符'
					},
					number : {// 不包含0的数字
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /^([1-9][0-9]*)$/.test(val) ? lengthValidator(
									val, param[0], param[1])
									: false; // ^\d+$
						},
						message : '{0}-{1}位数字字符'
					},
					allNumber : {// 包含0的数字
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /^([0-9]*)$/.test(val) ? lengthValidator(
									val, param[0], param[1]) : false; // ^\d+$
						},
						message : '{0}-{1}位数字字符'
					},
					money: {//金额
				        validator: function(val){
				            return /^((([1-9]\d{0,10})|[0]?)(\.\d{1,2})?)$/.test(val);
				        },
				        message: '11位长度的金额（注：最多允许两位小数）'
				    },
					specialChar : {// 特殊字符
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return lengthValidator(val, param[0], param[1]);
						},
						message : '{0}-{1}位字符，区分大小写；（注：一个全角字符等于三个英文字符）'
					},
					noFullyFormedChar : {// 不能输入全角字符
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /[\uFF00-\uFFFF]/g.test(val) ? lengthValidator(
									val, param[0], param[1])
									: false;
						},
						message : '{0}-{1}位字符（字母、数字、符号），区分大小写'
					},
					// 组合验证
					englishAndNumber : {// 只能输入英文和数字、下线划
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /^[A-Za-z0-9_]+$/.test(val) ? lengthValidator(
									val, param[0], param[1])
									: false; // ^\d+$
						},
						message : '{0}-{1}位字符（英文、数字)，区分大小写'
					},
					chineseAndNumber : {// 只能输入中文和数字、下线划
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /^[0-9\u4E00-\u9FA5_]+$/.test(val) ? lengthValidator(
									val, param[0], param[1])
									: false; // ^\d+$
						},
						message : '{0}-{1}位字符（中文、数字、下线划），区分大小写'
					},
					chineseAndEnglish : {// 只能输入中文和英文、下线划
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /^[A-Za-z\u4E00-\u9FA5_]+$/.test(val) ? lengthValidator(
									val, param[0], param[1])
									: false; // ^\d+$
						},
						message : '{0}-{1}位字符（中文、英文、下线划），区分大小写'
					},
					chineseAndEnglishAndNumber : {// 只能输入中文、英文和数字、下线划
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /^[A-Za-z0-9\u4E00-\u9FA5_]+$/.test(val) ? lengthValidator(
									val, param[0], param[1])
									: false; // ^\d+$
						},
						message : '{0}-{1}位字符（中文、英文、数字、下线划），区分大小写'
					},
					// 特殊类型验证
					telphone : {// 电话号码[]
						validator : function(val) {
							return /^((((13[0-9]{1})|189|(15[0-9]{1})|(0[1-9]{2}))+\d{8})|((0[1-9]{3}))+\d{7})$/
									.test(val);
						},
						message : '请输入正确的电话号码'
					},
					mobile : {// 手机号码
						validator : function(val) {
							return /^(1[0-9]{10})$/.test(val);
						},
						message : '请输入正确的手机号码15012345678'
					},
					postCode : {// 邮编
						validator : function(val) {
							return /^[1-9]\d{5}$/.test(val);
						},
						message : '请输入正确的邮编'
					},
					mustFloat : {// 只能输入浮点数
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /^(-?(0|([1-9]{1,}))\.{1}\d+)$/.test(val) ? lengthValidator(
									val, param[0], param[1])
									: false;
						},
						message : '{0}-{1}位浮点数'
					},
					mustBoolean : {// 只能输入布尔型数据
						validator : function(val) {
							return /^(true|false|1|0){1}$/.test(val);
						},
						message : '只能输入布尔型数据'
					},
					telphoneComma : {// 已逗号分隔电话号码
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /^((\d{11})(((,)(\d{11}))*))$/.test(val) ? lengthValidator(
									val, param[0], param[1])
									: false;
						},
						message : '{0}-{1}位字符（11位数字和逗号），区分大小写'
					},
					idCardNumber : {// 验证身份证号码
						validator : function(val) {
							// return
							// /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/.test(val);
							return /^\d{17}[\d|X]$/.test(val);
						},
						message : '请输入正确的身份证号码'
					},
					moneyNumber : {// 只能输入浮点数,验证单价或者数量，最大（整数位为7位，小数位为2位）,如果以0开头，整数位只能有1位，以非0开头，整数位最多为7位
						validator : function(val) {
							return /^((([1-9]\d{0,14})|[0]?)(\.\d{1,2})?)$/.test(val);
						},
						message : '15位长度的浮点数（注：最多允许两位小数）'
					},
					keyWord : {// 关键字
						validator : function(val, param) {
							if (0 == param[0] && val.length == 0) {
								return true;
							}
							return /^[\u0391-\uFFE5]{1,}([ ]{1}[\u0391-\uFFE5]{1,}){0,}$/
									.test(val) ? lengthValidator(val, param[0],
									param[1]) : false;
						},
						message : '{0}-{1}位关键字字符（关键字只能输入中文，每个关键字以空格分隔），区分大小写（注：一个中文字符等于三个英文字符）'
					},
					fuelPrice : {
						validator : function(val) {
							return /^((([1-9]\d{0,2})|[0]?)(\.\d{1,2})?)$/
									.test(val);
						},
						message : '3位长度的浮点数（注：最多允许两位小数）'
					},
					fuelQuality : {
						validator : function(val) {
							return /^((([1-9]\d{0,3})|[0]?)(\.\d{1,2})?)$/
									.test(val);
						},
						message : '4位长度的浮点数（注：最多允许两位小数）'
					},
					wageFloat : {
						validator : function(val, param) {
							return /^((([1-9]\d{0,5})|[0]?)(\.\d{1,2})?)$/
									.test(val);
						},
						message : '6位长度的浮点数（注：最多允许两位小数）'
					}
				});

// validatebox
$.extend($.fn.validatebox.methods, {
	// 清除校验
	clearValidate : function(jq) {
		return jq.each(function() {
			$(this).removeClass("validatebox-invalid");
			$(this).removeClass("validatebox-text");
			var tip = $.data(this, "validatebox").tip;
			if (tip) {
				tip.remove();
				$.data(this, "validatebox").tip = null;
			}
		});
	}
});

// combo methods
$.extend($.fn.combo.methods, {
	// 清除校验
	clearValidate : function(jq) {
		return $.data(jq[0], "combo").combo.find("input.combo-text")
				.validatebox("clearValidate");
	}
});

// tree methods
$.extend($.fn.tree.methods, {
	getCheckedData : function(tree) {
		var nodeData = [];
		$.each(tree.tree('getChecked'), function() {
			nodeData.push(this.attributes);
		});
		return nodeData;
	},
	getSelectedData : function(tree) {
		return tree.tree('getSelected').attributes;
	}
});

// datebox
$.extend($.fn.datebox.defaults, {
	formatter : function(date) {
		var y = date.getFullYear();
		var m = date.getMonth() + 1;
		var d = date.getDate();
		return y + '-' + (m < 10 ? ('0' + m) : m) + '-'
				+ (d < 10 ? ('0' + d) : d);
	},
	parser : function(s) {
		var t = Date.parse(s.replace(/-/g, "/"));
		if (!isNaN(t)) {
			return new Date(t);
		} else {
			return new Date();
		}
	}
});


//自定义FORM验证
CQOA.isValid = function(formId){
    var flag = true;
    $(formId + ' :input[type!=button]').each(function(){
        var obj = $(this);
        if (obj.attr('validType') && obj.attr("disabled") == undefined) {
            var valName = obj.attr('validType'), validateObj = $.fn.validatebox.defaults.rules[valName.substring(0, valName.indexOf('['))];
            if (validateObj) {
                var params = eval(valName.substring(valName.indexOf('[')));
                if (!validateObj.validator(obj.val(), params)) {
                    flag = false;
                    var str = validateObj.message;
                    for (var i = 0; i < params.length; i++) {
                        str = str.replace(new RegExp("\\{" + i + "\\}", "g"), params[i]);
                    }
                    if (obj.siblings('span.error').length > 0) {
                        obj.siblings('span.error').html(str);
                    }
                    else {
						obj.addClass("easyui-validatebox validatebox-text validatebox-invalid");
                        obj.parent().append('<span class="error">' + str + '</span>').addClass('error');
                    }
                }
                else {
					obj.removeClass("easyui-validatebox validatebox-text validatebox-invalid");
                    obj.parent().removeClass('error').children('span.error').remove();
                }
            }
        }
        if(obj.attr('notnull')){
        	 var val = obj.attr('validType');
        	 if(val){
        		 if(obj.val()==undefined||''==obj.val()){
        			 flag = false;
        			 obj.siblings('span.error').html('本属性不允许未空');
        		 }
        	 }
        }
    });
    return flag;
};